package com.knowledge.plus.序列化and反序列化;

import com.knowledge.plus.序列化and反序列化.pojo.SeriaUser;
import java.io.*;

/**
 * 序列化：将数据结构或对象转换成可以存储或传输的形式，通常是二进制字节流，也可以是 JSON, XML 等文本格式
 * 反序列化：将在序列化过程中所生成的数据转换为原始数据结构或者对象的过程
 *
 * @author aFei
 * @since 2023/6/27
 */
public class SerializationDemo {

    /**
     * 序列化和反序列化的过程中，如果类的成员变量发生了变化，可能会导致反序列化失败。
     * 因此，在类可序列化之前，需要认真考虑需要被序列化的成员变量，并使用序列化 ID 进行显式声明，从而避免这种问题。
     */
    public static void main(String[] args) {
        // 初始化对象
        SeriaUser seriaUser = new SeriaUser("Alice", "123456");

        // 创建了一个User 对象，并将其序列化到文件中（user.ser）
        try {
            FileOutputStream fileOut = new FileOutputStream("user.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(seriaUser);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in user.ser");
        } catch(IOException i) {
            i.printStackTrace();
        }

        // 从文件中读取数据，并使用反序列化来还原出对象
        try {
            FileInputStream fileIn = new FileInputStream("user.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            SeriaUser deserializedSeriaUser = (SeriaUser) in.readObject();
            in.close();
            fileIn.close();
            System.out.println("Name: " + deserializedSeriaUser.getName());
            System.out.println("Password: " + deserializedSeriaUser.getPassword());
        } catch(IOException i) {
            i.printStackTrace();
        } catch(ClassNotFoundException c) {
            System.out.println("User class not found");
            c.printStackTrace();
        }

    }

}
